; void combinar_asm (
; 	unsigned char *src_a,	RDI
; 	unsigned char *src_b,	RSI
; 	unsigned char *dst,		RDX
; 	int m,					ECX
; 	int n,					R8D
; 	int row_size,			R9D
; 	float alpha				XMM0
; );

global combinar_asm

divisor: dd 255.0,255.0,255.0,255.0

combinar_asm:
	mov rax, rsp
	push rbp
	mov rbp, rsp
	push rbx
	push r12
	push r13
	
	movdqu xmm7, [divisor] ;xmm7 = 255,0|255,0|255,0|255,0|	
	
	movdqu xmm1, xmm0
	pslldq xmm1, 4
	addps xmm0, xmm1
	movdqu xmm1, xmm0
	pslldq xmm1, 8
	addps xmm0, xmm1	;Pusimos los alpha en los 4 dw
	
	xor r12, r12 	;Contador filas
 		
.cicloFilas:	
	xor r13, r13	;Contador columnas

.cicloColumnas:		
	mov rbx, r12 	; j
	imul ebx, r9d	; j*row_size
	add rbx, r13	; copiamos de a 16
	
	movdqu xmm1, [rdi+rbx] ; copiamos 16 pixeles de la imagen src_a a xmm1.
	movdqu xmm2, [rsi+rbx] ; copiamos 16 pixeles de la imagen src_b a xmm2.
			
	movdqu xmm3, xmm1
	psrldq xmm3, 8			; Ponemos los 8 bytes mas significativos en la parte baja
	
	movdqu xmm4, xmm2
	psrldq xmm4, 8			; Ponemos los 8 bytes mas significativos en la parte baja
	
	pmovzxbw xmm1, xmm1
	pmovzxbw xmm2, xmm2
	pmovzxbw xmm3, xmm3
	pmovzxbw xmm4, xmm4		; Convertimos cada byte a word para hacer la resta
	
	;Copiamos xmm2 y xmm4 que es src_b para luego sumarlo al final del calculo
	movdqu xmm11, xmm2
	movdqu xmm12, xmm4
	
	psubsw xmm1, xmm2
	psubsw xmm3, xmm4		;Hacemos la resta de a word	
	
	movdqu xmm2, xmm1 ; Tenemos la resta de pixeles
	pmovsxwd xmm1, xmm1	;Convertimos a DW los 4 primeros bytes extendiendo con cero
	
	psrldq xmm2, 8	  ; Ponemos los segundos 4 bytes en la parte mas baja
	pmovsxwd xmm2, xmm2	;Convertimos a DW los 4 segundos bytes extendiendo con cero
	
	movdqu xmm4, xmm3 ; Tenemos la resta de pixeles
	pmovsxwd xmm3, xmm3	;Convertimos a DW los 4 terceros bytes extendiendo con cero
	
	psrldq xmm4, 8	  ; Ponemos los ultimos 4 bytes en la parte mas baja
	pmovsxwd xmm4, xmm4	;Convertimos a DW los 4 ultimos bytes extendiendo con cero
	
	cvtdq2ps xmm1, xmm1
	cvtdq2ps xmm2, xmm2
	cvtdq2ps xmm3, xmm3
	cvtdq2ps xmm4, xmm4	;Convertimos los DW a PS
	
	mulps xmm1, xmm0
	mulps xmm2, xmm0
	mulps xmm3, xmm0
	mulps xmm4, xmm0 ;Multilpicamos por el alpha
	
	divps xmm1, xmm7
	divps xmm2, xmm7
	divps xmm3, xmm7
	divps xmm4, xmm7 ;Divimos por 255
	
	cvtps2dq xmm1, xmm1
	cvtps2dq xmm2, xmm2
	cvtps2dq xmm3, xmm3
	cvtps2dq xmm4, xmm4	;Convertimos los PS a DW
	
	packssdw xmm1, xmm2
	packssdw xmm3, xmm4	;Convertimos los DW a w
	
	paddw xmm1, xmm11
	paddw xmm3, xmm12	;Sumamos src_b que ya lo teniamos separado por word
	
	packuswb xmm1, xmm3	;Convertimos los w a b
	
	; rbx guarda tambien la posicion de la imagen destino donde copiar los pixeles.
	
	movdqu [rdx+rbx], xmm1 ; copiamos los 16 pixeles de xmm1 a la imagen destino.
	
.avanzarColumnas:
	;add r13, 16 ; avanzamos a las proximas 16 columnas
	;cmp r13d, r8d
	;jl .cicloColumnas ; nos quedan pixeles (columnas) por recortar en la fila
	add r13, 16 ; avanzamos a las proximas 16 columnas
	cmp r13d, r8d
	je .avanzarFila
	.cuantoAtras:
	lea r10, [r13+16]
	cmp r10d, r8d	;si es menor o igual nos quedan por lo menos 16 columnas por copiar
	jle .cicloColumnas
	sub r13, 1
	jmp .cuantoAtras	;Con el ciclo calculamos cuanto tenemos que ir para atras para agrrar justo 16
		
.avanzarFila:
	add r12, 1	; vamos a la siguiente fila
	cmp r12d, ecx	
	jl .cicloFilas ; nos quedan filas por recortar

	pop r13
	pop r12
	pop rbx
	pop rbp
	ret